# coding=utf-8
from django.db import models
from datetime import *
from django.contrib.localflavor.br.br_states import STATE_CHOICES
from decimal import *
from django.forms.util import ErrorList

TIPO_C = (('0','Fornecedor'),('1','Revendedor'),('2','Serviços'),('3','Fornecedor e Revendedor'))

PESSOA_C =  (('0','Pessoa Jurídica'),('1','Pessoa Física'))

class Marcas(models.Model):
    nome = models.CharField('Nome', max_length=150, unique=True)
    observacao = models.TextField('Observação', blank=True, null=True)

    class Meta:
        verbose_name = "Marca"
        verbose_name_plural = 'Marcas'

    def __unicode__(self):
        return self.nome

class Tipo_Empresa(models.Model):
    nome = models.CharField('Nome', max_length=150, unique=True)

    class Meta:
        verbose_name = "Tipo de Empresa"
        verbose_name_plural = 'Tipos de Empresa'

    def __unicode__(self):
        return self.nome

class GaleriaFotos(models.Model):
    titulo = models.CharField('Título',max_length=50)
    imagem = models.ImageField('Imagem',upload_to='produtos')
    comentario = models.CharField('Legenda',max_length=255)
    imagem2 = models.ImageField('Imagem',upload_to='produtos',blank=True,null=True)
    comentario2 = models.CharField('Legenda',max_length=255,blank=True,null=True)
    imagem3 = models.ImageField('Imagem',upload_to='produtos',blank=True,null=True)
    comentario3 = models.CharField('Legenda',max_length=255,blank=True,null=True)
    imagem4 = models.ImageField('Imagem',upload_to='produtos',blank=True,null=True)
    comentario4 = models.CharField('Legenda',max_length=255,blank=True,null=True)
    imagem5 = models.ImageField('Imagem',upload_to='produtos',blank=True,null=True)
    comentario5 = models.CharField('Legenda',max_length=255,blank=True,null=True)
    data = models.DateTimeField('Data de publicação',default=datetime.now,blank=True,null=True)


    class Meta:
        verbose_name_plural = 'Galeria de Fotos'
    def __unicode__(self):
        return self.titulo


class Produto(models.Model):
    nome = models.CharField('Nome do Produto', max_length=255, unique=True)
    marca = models.ForeignKey(Marcas)
    codigo = models.CharField('Código', max_length=100, unique=True)
    imagens = models.ForeignKey(GaleriaFotos,blank=True,null=True)
    ativo = models.BooleanField('Disponível',default=False)
    quantidade = models.IntegerField('Quantidade',default=0,blank=True,null=True)
    valor = models.DecimalField('Valor Unitário R$', max_digits=10,decimal_places=2,blank=True,null=True,default=0.0, help_text=11.55)
    observacao = models.TextField('Observações', blank=True, null=True)
    dt_cadastro = models.DateTimeField('Data de Cadastro',default=datetime.now,blank=True,null=True)
    lucro = models.DecimalField('Percentual de Lucro %', blank=True, null=True, max_digits=5,decimal_places=2,default=100,help_text="Porcentagem")
    desconto = models.DecimalField('Percentual de desconto %', blank=True, null=True, max_digits=5,decimal_places=2,default=100,help_text="Porcentagem")
    qtdloja = models.IntegerField('Quantidade na loja',default=0,blank=True,null=True)

    class Meta:
        verbose_name_plural = 'Produtos'
        verbose_name = 'Produto'

    def save(self):
        if self.quantidade >0:
            self.ativo=True
        if self.quantidade == 0:
            self.ativo=False
        super(Produto,self).save()

    def __unicode__(self):
        return self.nome

class Fornecedor(models.Model):
    nome = models.CharField('Nome', max_length=50)
    nomefantasia = models.CharField('Nome Fantasia', max_length=30, blank=True, null=True)
    pessoa = models.CharField('Tipo',max_length='2',choices=PESSOA_C, default="0")
    tipo = models.ManyToManyField(Tipo_Empresa)
    cnpj = models.CharField('CNPJ', blank=True, null=True, max_length=18)
    cpf = models.CharField('CPF', blank=True, null=True, max_length=18)
    rg = models.CharField('RG', blank=True, null=True, max_length=18)
    inscricaoestadual = models.FloatField('Inscrição Estadual', max_length=20, blank=True, null=True)
    telefone = models.CharField('Telefone', max_length=20)
    emailempresa = models.EmailField('Email da Empresa', max_length=50)
    endereco = models.CharField('Endereço', max_length=50)
    cep = models.CharField('CEP', max_length=15)
    bairro = models.CharField('Bairro', max_length=50)
    cidade = models.CharField('Cidade', max_length=30, default='Teresina')
    estado = models.CharField('Estado', max_length = 2, choices=STATE_CHOICES, default='PI')
    observacao = models.TextField('Observação', blank=True, null=True)
    site = models.URLField('Site da empresa', blank=True, null=True)
    facebook = models.URLField('Facebook', blank=True, null=True)
    twitter = models.URLField('Twitter', blank=True, null=True)
    datacadastro = models.DateTimeField(default=datetime.now, blank=True, null=True)

    #Vendedor
    comissao = models.DecimalField('Comissão %', blank=True, null=True,default=0, max_digits=5,decimal_places=2)
    limitecompra = models.DecimalField('Limite da Compra R$', blank=True, null=True, max_digits=10,decimal_places=2,default=0.0)
    tabelaprecovenda = models.DecimalField('Acressimo na tabela de preço %', blank=True, null=True,default=0, max_digits=5,decimal_places=2)


    class Meta:
        verbose_name_plural = 'Empresas'
        verbose_name = 'Empresa'

    def __unicode__(self):
        return  self.nome


class Contatos(models.Model):
    forn = models.ForeignKey(Fornecedor)
    nome = models.CharField('Nome', max_length=150, unique=True, blank=True, null=True)
    aniversario = models.DateField('Aniversário', blank=True, null=True)
    telefoneresponsavel = models.CharField('Telefone do Responsável', max_length=20, blank=True, null=True)
    emailresponsavel = models.EmailField('E-mail', max_length=50, blank=True, null=True)

    class Meta:
        verbose_name = "Contato"
        verbose_name_plural = 'Contatos'

    def __unicode__(self):
        return self.nome

class Tabela(models.Model):
    nome = models.CharField('Nome da tabela', max_length=140)
    custofrete = models.DecimalField('Custo do Frete %', max_digits=5,decimal_places=2, help_text="Porcentagem")
    custoembalagem = models.DecimalField('Custo da Embalagem', max_digits=10,decimal_places=2,help_text='Em R$')


    def __unicode__(self):
        return self.nome

class Pedido(models.Model):
    codigo = models.CharField('Número da Nota', max_length=100, blank=True, null=True)
    valortotalnota = models.DecimalField('Valor total', blank=True, null=True, max_digits=10,decimal_places=2,default=0.0, editable=False)
    datacompra = models.DateField('Data da Compra')
    fornecedor = models.ForeignKey(Fornecedor)
    dataentrada = models.DateTimeField('Entrada no Sistema',default=datetime.now, blank=True, null=True)
    totaldeitens = models.IntegerField('Total de Itens', blank=True, null=True,default=0, editable=False)
    notas = models.FileField('Nota de Compra', upload_to='Notas',blank=True,null=True)
    observacao = models.TextField('Observação', blank=True, null=True)
    pnumero = models.BooleanField('Sem NF',default=False)


    class Meta:
        verbose_name_plural = 'Compras'
        verbose_name = 'Compra'

    def save(self):
        if self.codigo == "" :
            self.codigo = "Sem Numero"
        super(Pedido,self).save()

        if self.pnumero == True:
            self.codigo = 'Sem NF'
        super(Pedido,self).save()


    def __unicode__(self):
        return self.codigo


class CompraProdutoFornecedor(models.Model):
    codigo = models.CharField('Código', max_length=50)
    pedido = models.ForeignKey(Pedido, verbose_name='Número da Nota')
    produtofornecedor = models.ForeignKey(Produto, verbose_name='Produto')
    ativo = models.BooleanField(default=False)
    quantidade = models.IntegerField('Quantidade')
    valorunitario = models.DecimalField('Valor Unitário', max_digits=10,decimal_places=2)
    valortotal = models.DecimalField('Valor total', blank=True, null=True, max_digits=10,decimal_places=2, default=0.0)
    tabela = models.ForeignKey(Tabela)
    datacompra = models.DateTimeField('Data da Compra',default=datetime.now, blank=True, null=True)
    valor = models.DecimalField('Valor Sugerido', blank=True, null=True, max_digits=10,decimal_places=2)
    valora = models.DecimalField('Valor Atual Unitário', blank=True, null=True, max_digits=10,decimal_places=2)
    subtituir = models.BooleanField('Apagar',default=False)
    fornecedor = models.ForeignKey(Fornecedor, blank=True, null=True)


    class Meta:
        verbose_name_plural = 'Itens para compra'
        verbose_name = 'Item'

    def save(self):

        if self.quantidade != 0:

            pedido = Pedido.objects.get(id = self.pedido.id)
            produto = Produto.objects.get(id =self.produtofornecedor.id)

            self.valortotal = self.valorunitario*self.quantidade


            k = Decimal(0.1)
            l = Decimal(0.01)

            self.custoimposto = (self.valorunitario + ((self.valorunitario*self.tabela.custofrete)*l))*k



            self.valor = ((self.valorunitario+((self.valorunitario*self.tabela.custofrete)*l)+
                           self.custoimposto)+((self.valorunitario+((self.valorunitario*self.tabela.custofrete)*l)
                            +self.custoimposto)*(self.produtofornecedor.lucro*l))+self.tabela.custoembalagem)


            if self.delete == True:
                pedido.totaldeitens = 0
                if pedido.totaldeitens > 0:
                    try:
                        obj = CompraProdutoFornecedor.objects.get(id = self.id)
                        x = obj.quantidade
                        y = obj.valortotal

                        pedido.totaldeitens = 0
                        pedido.valortotalnota = (pedido.valortotalnota -y) - self.valortotal
                        pedido.save()
                        produto.quantidade = (produto.quantidade - x) - self.quantidade
                        produto.qtdloja = (produto.qtdloja - x) - self.quantidade
                        produto.save()
                    except CompraProdutoFornecedor.DoesNotExist:
                        pedido.totaldeitens = 0
                        pedido.valortotalnota = pedido.valortotalnota - self.valortotal
                        pedido.save()
                        produto.quantidade = produto.quantidade - self.quantidade
                        produto.qtdloja = produto.qtdloja - self.quantidade
                        produto.save()


            if pedido.totaldeitens > 0:
                try:
                    obj = CompraProdutoFornecedor.objects.get(id = self.id)
                    x = obj.quantidade
                    y = obj.valortotal

                    pedido.totaldeitens = (pedido.totaldeitens - x) + self.quantidade
                    pedido.valortotalnota = (pedido.valortotalnota -y) + self.valortotal
                    pedido.save()
                    produto.quantidade = (produto.quantidade - x) + self.quantidade
                    produto.qtdloja = (produto.qtdloja - x) + self.quantidade
                    produto.save()


                except CompraProdutoFornecedor.DoesNotExist:
                    pedido.totaldeitens = pedido.totaldeitens + self.quantidade
                    pedido.valortotalnota = pedido.valortotalnota + self.valortotal
                    pedido.save()
                    produto.quantidade = produto.quantidade + self.quantidade
                    produto.qtdloja = produto.qtdloja + self.quantidade
                    produto.save()

            if pedido.totaldeitens == 0:
                pedido.totaldeitens = pedido.totaldeitens + self.quantidade
                pedido.valortotalnota = pedido.valortotalnota + self.valortotal
                pedido.save()
                produto.quantidade = produto.quantidade + self.quantidade
                produto.qtdloja = produto.qtdloja + self.quantidade
                produto.save()



        if self.quantidade >0:
            produto = Produto.objects.get(id =self.produtofornecedor.id)
            if self.valora != 0:
                produto.valor = self.valora
                produto.save()
                self.valora = produto.valor
            try:
                obj = CompraProdutoFornecedor.objects.get(id = self.id)
                if self.valora != obj.valora:
                    produto.valor = self.valora
                    produto.save()
                    self.valora = produto.valor
                else:
                    self.valora = produto.valor
            except:
                self.valora = produto.valor
            self.ativo=True


        if self.quantidade == 0:
            self.ativo=False

        if self.subtituir == True:
            self.valortotal = self.valor = self.valorunitario = self.valora = self. quantidade = self.codigo = 0
            #self.produtofornecedor = " "
            self.subtituir = False

        self.fornecedor = self.pedido.fornecedor

        super(CompraProdutoFornecedor,self).save()


    def __unicode__(self):
        return self.produtofornecedor.nome


class Revenda(models.Model):
    codigo = models.CharField('Número da Nota', max_length=100)
    valortotalnota = models.DecimalField('Valor total', blank=True, null=True, max_digits=10,decimal_places=2,default=0.0, editable=False)
    datacompra = models.DateField('Data da Compra')
    vendedor = models.ForeignKey(Fornecedor)
    dataentrada = models.DateTimeField('Entrada no Sistema',default=datetime.now, blank=True, null=True)
    totaldeitens = models.IntegerField('Total de Itens', blank=True, null=True,default=0, editable=False)
    notas = models.FileField('Recibo', upload_to='Notas',blank=True,null=True)
    observacao = models.TextField('Observação', blank=True, null=True)


    class Meta:
        verbose_name_plural = 'Revenda'
        verbose_name = 'Revenda'

    def __unicode__(self):
        return self.codigo

class CompraProdutoVendedor(models.Model):
    revenda = models.ForeignKey(Revenda, verbose_name='Número da Nota')
    produtofornecedor = models.ForeignKey(Produto, verbose_name='Produto',unique=True)
    quantidade = models.IntegerField('Quantidade')
    qtddisp = models.IntegerField('Quantidade disponível', blank=True, null=True,default=0)
    valorunitario = models.DecimalField('Valor Unitário', max_digits=10,decimal_places=2, blank=True, null=True,default=0)
    valortotal = models.DecimalField('Valor total', blank=True, null=True, max_digits=10,decimal_places=2, default=0.0)
    datacompra = models.DateTimeField('Data da Compra',default=datetime.now, blank=True, null=True)
    valor = models.DecimalField('Valor Sugerido', blank=True, null=True, max_digits=10,decimal_places=2)
    fornecedor = models.ForeignKey(Fornecedor, blank=True, null=True)


    class Meta:
        verbose_name_plural = 'Itens para Revenda'
        verbose_name = 'Item'


    def save(self):

        if self.quantidade != 0:
            l = Decimal(0.01)
            produto = Produto.objects.get(id =self.produtofornecedor.id)
            revenda = Revenda.objects.get(id = self.revenda.id)
            msg = u"Este campo é obrigatório."


            forn = Fornecedor.objects.get(id = self.revenda.vendedor.id)

            self.valortotal = self.quantidade * (self.produtofornecedor.valor+self.produtofornecedor.valor*forn.tabelaprecovenda*l)
            self.valortotal = self.valorunitario*self.quantidade

            self.valor = self.produtofornecedor.valor+(self.produtofornecedor.valor*forn.tabelaprecovenda*l)

            if revenda.totaldeitens > 0:
                try:
                    msg = u"Este campo é obrigatório."
                    obj = CompraProdutoVendedor.objects.get(id = self.id)
                    x = obj.qtdloja
                    y = obj.valortotal
                    k = obj.qtdloja

                    if (produto.qtdloja-self.quantidade) <= 0:
                        self.quantidade = 0
                        self.qtddisp = produto.qtdloja
                    else:
                        produto.qtdloja = (produto.qtdloja - k) - self.quantidade
                        produto.save()
                        revenda.totaldeitens = (revenda.totaldeitens - x) + self.quantidade
                        revenda.valortotalnota = (revenda.valortotalnota -y) + self.valortotal
                        revenda.save()
                        self.qtddisp = produto.qtdloja
                except:
                    if (produto.qtdloja-self.quantidade) <= 0:
                        self.quantidade = 0
                        self.qtddisp = produto.qtdloja
                    else:
                        produto.qtdloja = produto.qtdloja - self.quantidade
                        produto.save()
                        revenda.totaldeitens = revenda.totaldeitens + self.quantidade
                        revenda.valortotalnota = revenda.valortotalnota + self.valortotal
                        revenda.save()
                        self.qtddisp = produto.qtdloja

            if revenda.totaldeitens == 0:
                if (produto.qtdloja-self.quantidade) <= 0:
                    self.quantidade = 0
                    self.qtddisp = produto.qtdloja
                else:
                    produto.qtdloja = produto.qtdloja - self.quantidade
                    produto.save()
                    revenda.totaldeitens = revenda.totaldeitens + self.quantidade
                    revenda.valortotalnota = revenda.valortotalnota + self.valortotal
                    revenda.save()
                    self.qtddisp = produto.qtdloja



        super(CompraProdutoVendedor,self).save()

    def __unicode__(self):
        return self.produtofornecedor.nome